#include "stdio.h"
#include "math.h"

const int MaxValue=300;

void reset(int* array,int n,int value)
{
    for(int i=0;i<n;i++)
    {
        array[i]=value;
    }
}

int ss[300];
int ss_len=0;

int isSs(int num){
    int tmp=(int)sqrt(num);
    for(int j=0;j<ss_len;j++)
    {
        if(ss[j]>tmp)
        {
            break;
        }
        if(num%ss[j]==0)
        {
            return 0;
            break;
        }
    }
    return 1;
}

int len0=0,len1=0;
//array1连接的哪个array0 
int* match;

int** pipei;
//array1有没有被搜索
int* vis;


int dfs(int now)
{
    for(int i=0;i<len1;i++)
    {
        //如果有连接 且没有被搜索
        if(pipei[now][i]&&!vis[i])
        {
            vis[i]=1;
            //如果现在没有匹配
            if(match[i]==-1)
            {
                match[i]=now;
                return 1;
            }
            //搜索 连接i的顶点能不能找到别的连接
            else if(dfs( match[i]))
            {
                match[i]=now;
                return 1;
            }
        }
    }
    return 0;
}

void printArray(int** array,int n,int m){
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            printf("%d ",array[i][j]);
        }
        printf("\n");
    }
}

int main(){

    int i,j;
    ss[0]=2;
    ss_len=1;
    for(i=3;i<MaxValue;i++)
    {
        if(isSs(i))
        {
            ss[ss_len]=i;
            ss_len++;
        }
    }

    // for(i=0;i<ss_len;i++)
    // {
    //     printf("%d ",ss[i]);
    // }
    // printf("\n");

    int n,tmp;

    scanf("%d",&n);
    int* array0=new int[n];
    len0=0;
    int* array1=new int[n];
    len1=0;
    
    //分成2组 只有奇偶配对的才可能是素数
    for(i=0;i<n;i++)
    {
        scanf("%d",&tmp);
        if(tmp%2==0)
        {
            array0[len0]=tmp;
            len0++;
        }
        else{
            array1[len1]=tmp;
            len1++;
        }
    }

    //交换位置 少的在前面好处理
    if(len0>len1)
    {
        int* tmp_array=array0;
        array0=array1;
        array1=tmp_array;

        tmp=len0;
        len0=len1;
        len1=tmp;
    }

    //记录好二分图的邻接矩阵
    pipei=new int*[len0];
    for(i=0;i<len0;i++)
    {
        pipei[i]=new int[len1];
        for(j=0;j<len1;j++)
        {
            int sum=array0[i]+array1[j];
            if(isSs(sum))
            {
                pipei[i][j]=1;
            }
            else{
                pipei[i][j]=0;
            }
        }
    }

    // printArray(pipei,len0,len1);

    //匈牙利算法求最大匹配度
    match=new int[len1];
    //array1有没有被搜索
    vis=new int[len1];

    reset(match,len1,-1);
    
    int count=0;
    for(i=0;i<len0;i++)
    {
        reset(vis,len1,0);
        if(dfs(i))
        {
            count++;
        }
    }

    printf("%d\n",count);

    delete array0;
    delete array1;
    delete match;
    delete vis;
    for(i=0;i<len0;i++)
    {
        delete pipei[i];
    }
    delete pipei;
    

    return 0;
}